const express = require('express')
const multer = require('multer')
const path = require('path')
const fs = require('fs').promises
let dayjs = require('dayjs')
// 上传目录
const uploadDir = '../../uploadFiles'

// 异步创建文件夹
const createUploadDir = async () => {
  try {
    // 检查文件夹是否存在
    await fs.access(uploadDir)
  } catch (err) {
    if (err.code === 'ENOENT') {
      // 文件夹不存在，创建文件夹
      try {
        await fs.mkdir(uploadDir, { recursive: true })
        console.log('文件夹创建成功')
      } catch (mkdirErr) {
        console.error('创建文件夹失败:', mkdirErr)
      }
    } else {
      console.error('访问文件夹失败:', err)
    }
  }
}
createUploadDir()

// 配置 multer 存储选项
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, uploadDir)
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + path.extname(file.originalname))
  },
})
const fileFilter = async (req, file) => {
  const allowedTypes = [
    'image/jpeg',
    'image/png',
    'application/pdf',
    // 'video/mp4',
    // 'txt',
    'doc',
    'docx',
    'xls',
    'xlsx',
    'ppt',
    'pptx',
    'rar',
    'zip',
  ]

  if (!allowedTypes.includes(file.mimetype)) {
    throw {
      code: 'INVALID_FILE_TYPE',
      message: '文件类型不符合要求',
      details: `不支持的文件类型: ${file.mimetype}`,
    } // 抛出包含详细信息的对象
  }
  return true // 文件类型符合要求
}

// Multer 配置
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 10 * 1024 * 1024, // 限制文件大小为 10MB
  },
  fileFilter: async (req, file, cb) => {
    try {
      const result = await fileFilter(req, file)
      cb(null, result) // 文件类型符合要求
    } catch (err) {
      cb(err) // 捕获异常并传递给 Multer
    }
  },
})

// 处理文件上传
const handleFileUpload = async (req, res) => {
  try {
    if (!req.file) {
      throw new Error('没有上传文件')
    }
    return {
      msg: '操作成功',
      time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
      msgCode: 10000,
      data: {
        message: '文件上传成功',
        success: true,
      },
    }
  } catch (err) {
    // console.log(err, 33333333)
  }
}

module.exports = { upload, handleFileUpload }
